{
 "cells": [
  {
   "cell_type": "code",
   "execution_count": 2,
   "metadata": {},
   "outputs": [],
   "source": [
    "# Author: Antti Kiviaho\n",
    "# Date 1.10.2024\n",
    "\n",
    "import numpy as np\n",
    "import pandas as pd\n",
    "import seaborn as sns\n",
    "from scipy.stats import ranksums, spearmanr\n",
    "from matplotlib import pyplot as plt\n",
    "\n",
    "import os\n",
    "os.chdir('/lustre/scratch/kiviaho/prostate_spatial/')\n"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## Data downloads"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 3,
   "metadata": {},
   "outputs": [],
   "source": [
    "# Download the data\n",
    "dat = pd.read_csv('./data/multiplex_ihc_qupath_classifier_cellcounts_20240925.csv',sep=';',header=0)\n",
    "\n",
    "# Remove dash from Image ID\n",
    "dat['Image'] = [c.replace('-','') for c in dat['Image']]\n",
    "dat['Image'] = [c.replace('.tif','') for c in dat['Image']]\n",
    "dat.index = dat['Image']\n",
    "\n",
    "# Add a sample identifier\n",
    "dat['Sample'] = [s.split('_')[0].replace('m','') for s in dat['Image']]\n",
    "\n",
    "# QuPath outputs zeros as NaN\n",
    "dat = dat.fillna(0)\n",
    "\n",
    "# Load the ROI club-like positive / negative annotations\n",
    "roi_club_annot = pd.read_excel('./data/ROIs_club_annotation_info.xlsx')\n",
    "roi_club_annot = roi_club_annot.set_index('ROI_id')\n",
    "roi_club_annot_sorted = roi_club_annot.loc[dat['Image']]\n"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## Raw cell count-based plotting"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### Club-like cells & PMN-MDSCs correlation plot (Figure 4h)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "image/png": "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",
      "text/plain": [
       "<Figure size 151.2x144 with 1 Axes>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "plot_data = dat.copy()\n",
    "\n",
    "# Add the 'club-like status' annotation\n",
    "plot_data = plot_data.loc[roi_club_annot_sorted.index]\n",
    "plot_data['Club-like status'] = pd.Categorical(roi_club_annot_sorted['club_status'].replace({'club_neg':'Club-like negative','club_pos':'Club-like positive'}),categories=['Club-like negative','Club-like positive'])\n",
    "\n",
    "plot_data['Num Club like cells_log'] = np.log10(plot_data['Num Club like cells'] + 1)\n",
    "plot_data['Num MDSCs_log'] = np.log10(plot_data['Num MDSCs'] + 1)\n",
    "\n",
    "c1 = 'Num Club like cells'\n",
    "c2 = 'Num MDSCs'\n",
    "\n",
    "sns.set_theme(style='white',palette=sns.color_palette(['lightgray','#ffd92f']),font_scale=0.63)\n",
    "fig, ax = plt.subplots(figsize=(2.1, 2.0))\n",
    "\n",
    "sns.regplot(\n",
    "    plot_data,\n",
    "    x='Num Club like cells_log',\n",
    "    y='Num MDSCs_log',\n",
    "    color='gray',\n",
    "    ci=95,\n",
    "    ax=ax,\n",
    "    line_kws={'linewidth':2},\n",
    "    scatter_kws={'s':3}\n",
    ")\n",
    "\n",
    "\n",
    "plot_data_no_nans = plot_data[['Num Club like cells','Num MDSCs']].dropna()\n",
    "rho, pval = spearmanr(plot_data_no_nans['Num Club like cells'],plot_data_no_nans['Num MDSCs'])\n",
    "\n",
    "plt.text(0.5, 2.5, f'rho={rho:.2f}\\np={pval:.2e}', ha='left',fontsize=7,fontweight='normal')\n",
    "\n",
    "ax.set_xlabel('log10 Club-like cells',fontsize=7)\n",
    "ax.set_ylabel('log10 PMN-MDSCs',fontsize=7)\n",
    "\n",
    "plt.tight_layout()\n",
    "\n",
    "# Save plot\n",
    "#plt.savefig('./plots/multiplex_ihc/club_like_cells_MDSCs_cellcount_correlation.pdf')\n",
    "\n",
    "# Show plot\n",
    "plt.show()"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### Total number of cells (Supplementary Figure S7b)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 13,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "image/png": "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",
      "text/plain": [
       "<Figure size 144x216 with 1 Axes>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "y_var = 'Num Detections'\n",
    "\n",
    "# Match the data and the annotation indices and concat\n",
    "plot_data = dat.copy()\n",
    "plot_data = plot_data.loc[roi_club_annot_sorted.index]\n",
    "\n",
    "# Attach the ROI labels\n",
    "plot_data['Club-like status'] = pd.Categorical(roi_club_annot_sorted['club_status'].replace({'club_neg':'Club-like negative','club_pos':'Club-like positive'}),categories=['Club-like negative','Club-like positive'])\n",
    "\n",
    "# Log-transform\n",
    "plot_data[y_var] = np.log10(plot_data[y_var] + 1)\n",
    "\n",
    "\n",
    "sns.set_theme(style='white',palette=sns.color_palette(['lightgray','#ffd92f']),font_scale=0.5)\n",
    "fig,ax = plt.subplots(figsize=(2,3))\n",
    "\n",
    "plt.grid(True, which='both', linestyle='--', axis='y', linewidth=1)\n",
    "\n",
    "sns.stripplot(\n",
    "    plot_data,\n",
    "    x='Club-like status',\n",
    "    y=y_var,\n",
    "    color='black',\n",
    "    s=2,\n",
    "    ax=ax,\n",
    ")\n",
    "\n",
    "sns.violinplot(\n",
    "    plot_data,\n",
    "    x='Club-like status',\n",
    "    y=y_var,\n",
    "    linewidth=1,\n",
    "    inner=None,\n",
    "    ax=ax\n",
    ")\n",
    "\n",
    "\n",
    "# Perform Wilcoxon rank-sum test\n",
    "group_yes = plot_data[plot_data['Club-like status'] == 'Club-like positive'][y_var]\n",
    "group_no = plot_data[plot_data['Club-like status'] == 'Club-like negative'][y_var]\n",
    "stat, p_value = ranksums(group_yes, group_no)\n",
    "\n",
    "\n",
    "# Annotate p-value on the plot\n",
    "plt.text(0.3, plot_data[y_var].max()-0.01*plot_data[y_var].max(), f'p={p_value:.2e}', ha='center',fontsize=7,fontweight='normal')\n",
    "\n",
    "ylab = y_var.replace('Num ','')\n",
    "ax.set_xlabel('Selected ROI',fontsize=7)\n",
    "ax.set_ylabel(f'log10 {ylab} count',fontsize=7)\n",
    "\n",
    "plt.tight_layout()\n",
    "# Save the plot\n",
    "ylab = ylab.replace(' ','')\n",
    "#plt.savefig(f'./plots/multiplex_ihc/club_status_defined_in_ROI_selection_vs_{ylab}_violinplot_logscale.pdf')\n",
    "\n",
    "# Show the plot\n",
    "plt.show()"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### Number of club-like cells  (Supplementary Figure S7c)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 17,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "image/png": "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",
      "text/plain": [
       "<Figure size 144x216 with 1 Axes>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "y_var = 'Num Club like cells'\n",
    "\n",
    "# Match the data and the annotation indices and concat\n",
    "plot_data = dat.copy()\n",
    "plot_data = plot_data.loc[roi_club_annot_sorted.index]\n",
    "\n",
    "# Attach the ROI labels\n",
    "plot_data['Club-like status'] = pd.Categorical(roi_club_annot_sorted['club_status'].replace({'club_neg':'Club-like negative','club_pos':'Club-like positive'}),categories=['Club-like negative','Club-like positive'])\n",
    "\n",
    "# Log-transform\n",
    "plot_data[y_var] = np.log10(plot_data[y_var] + 1)\n",
    "\n",
    "\n",
    "sns.set_theme(style='white',palette=sns.color_palette(['lightgray','#ffd92f']),font_scale=0.5)\n",
    "fig,ax = plt.subplots(figsize=(2,3))\n",
    "\n",
    "plt.grid(True, which='both', linestyle='--', axis='y', linewidth=1)\n",
    "\n",
    "sns.stripplot(\n",
    "    plot_data,\n",
    "    x='Club-like status',\n",
    "    y=y_var,\n",
    "    color='black',\n",
    "    s=2,\n",
    "    ax=ax,\n",
    ")\n",
    "\n",
    "sns.violinplot(\n",
    "    plot_data,\n",
    "    x='Club-like status',\n",
    "    y=y_var,\n",
    "    linewidth=1,\n",
    "    inner=None,\n",
    "    ax=ax\n",
    ")\n",
    "\n",
    "\n",
    "# Perform Wilcoxon rank-sum test\n",
    "group_yes = plot_data[plot_data['Club-like status'] == 'Club-like positive'][y_var]\n",
    "group_no = plot_data[plot_data['Club-like status'] == 'Club-like negative'][y_var]\n",
    "stat, p_value = ranksums(group_yes, group_no)\n",
    "\n",
    "\n",
    "# Annotate p-value on the plot\n",
    "plt.text(0.3, plot_data[y_var].max()-0.01*plot_data[y_var].max(), f'p={p_value:.2e}', ha='center',fontsize=7,fontweight='normal')\n",
    "\n",
    "ylab = y_var.replace('Num ','')\n",
    "ax.set_xlabel('Selected ROI',fontsize=7)\n",
    "ax.set_ylabel(f'log10 {ylab} count',fontsize=7)\n",
    "ax.set_ylim(-0.2,4.8) \n",
    "\n",
    "plt.tight_layout()\n",
    "\n",
    "# Save the plot\n",
    "ylab = ylab.replace(' ','')\n",
    "#plt.savefig(f'./plots/multiplex_ihc/club_status_defined_in_ROI_selection_vs_{ylab}_violinplot_logscale.pdf')\n",
    "\n",
    "# Show the plot\n",
    "plt.show()"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## Use cell count normalized data (Pct of cells in ROI)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### Pct MDSCs violinplot (Figure 4i)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 19,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "image/png": "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",
      "text/plain": [
       "<Figure size 144x144 with 1 Axes>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "y_var = 'Pct MDSCs'\n",
    "\n",
    "# Match the data and the annotation indices and concat\n",
    "plot_data = dat_cellcounts.copy()\n",
    "plot_data = plot_data.loc[roi_club_annot_sorted.index]\n",
    "\n",
    "plot_data['Club-like status'] = pd.Categorical(roi_club_annot_sorted['club_status'].replace({'club_neg':'Club-like negative','club_pos':'Club-like positive'}),categories=['Club-like negative','Club-like positive'])\n",
    "\n",
    "\n",
    "sns.set_theme(style='white',palette=sns.color_palette(['lightgray','#ffd92f']),font_scale=0.5)\n",
    "\n",
    "fig,ax = plt.subplots(figsize=(2,2))\n",
    "\n",
    "plt.grid(True, which='both', linestyle='--', axis='y', linewidth=1)\n",
    "\n",
    "sns.stripplot(\n",
    "    plot_data,\n",
    "    x='Club-like status',\n",
    "    y=y_var,\n",
    "    color='black',\n",
    "    s=2,\n",
    "    ax=ax,\n",
    ")\n",
    "\n",
    "sns.violinplot(\n",
    "    plot_data,\n",
    "    x='Club-like status',\n",
    "    y=y_var,\n",
    "    linewidth=1,\n",
    "    inner=None,\n",
    "    ax=ax\n",
    ")\n",
    "\n",
    "\n",
    "# Perform Wilcoxon rank-sum test\n",
    "group_yes = plot_data[plot_data['Club-like status'] == 'Club-like positive'][y_var].dropna()\n",
    "group_no = plot_data[plot_data['Club-like status'] == 'Club-like negative'][y_var].dropna()\n",
    "stat, p_value = ranksums(group_yes, group_no)\n",
    "\n",
    "\n",
    "# Annotate p-value on the plot\n",
    "plt.text(0.3, (plot_data[y_var].max()-0.1*plot_data[y_var].max()), f'Wilcoxon rank-sum\\np={p_value:.2e}', ha='center',fontsize=7,fontweight='normal')\n",
    "\n",
    "ylab = y_var.replace('Pct ','')\n",
    "ax.set_xlabel('Selected ROI',fontsize=7)\n",
    "ax.set_ylabel(f'{ylab} (% of detected cells) ',fontsize=7)\n",
    "\n",
    "plt.tight_layout()\n",
    "# Save the plot\n",
    "#plt.savefig(f'./plots/multiplex_ihc/club_status_defined_in_ROI_selection_vs_{ylab}_violinplot.pdf')\n",
    "\n",
    "# Show the plot\n",
    "plt.show()"
   ]
  }
 ],
 "metadata": {
  "kernelspec": {
   "display_name": "squidpy",
   "language": "python",
   "name": "python3"
  },
  "language_info": {
   "codemirror_mode": {
    "name": "ipython",
    "version": 3
   },
   "file_extension": ".py",
   "mimetype": "text/x-python",
   "name": "python",
   "nbconvert_exporter": "python",
   "pygments_lexer": "ipython3",
   "version": "3.8.15"
  }
 },
 "nbformat": 4,
 "nbformat_minor": 2
}
